﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System;
using System.Runtime.InteropServices;
using System.Diagnostics; 
class DownLoadItem
{
	string  url;
	int		times;
}
public class FILEDATA
{
	public string filename;
	public string setupdir;
	public byte[] bytes;
	public bool bsaved;
	public TWWW w3;
	public FILEDATA()
	{
		bsaved = false;
	}
}
public class TWWW
{
	public	bool bsaved;
	public TWWW(string str)
	{
		bsaved = false;
		www =  new WWW(str);
	}
	public WWW www;
}
//[StructLayout(LayoutKind.Sequential)]
 
public class WebDownload : MonoBehaviour {
	
	public int maxdownload =40;
	public string webservername ="";// "http://188.188.2.196/game/data/";
	static public WebDownload instance;
	static public WebDownload GetInstance()
	{
		return instance;
	}
	List<string> DownLoadQueue = new List<string>();
	
	List<TWWW>downloadinglist = new  List<TWWW>();
	
	List<string>taskqueue = new List<string>();
	public bool AddDownLoad(string str)
	{
		Init();
		
		string webdownaload = str;
		str.Trim();
		str = str.Replace(" ","%20");
		str = str.Replace('\\','/');
		string nstr = str;
		nstr =nstr.Normalize();

		if(string.IsNullOrEmpty(str) || string.IsNullOrEmpty(Path.GetFileName(str)))
		{
			UnityEngine.Debug.LogError("url"+str+"不合法");
			return false;
		}
		if(taskqueue.IndexOf(str)<0)
		{
			taskqueue.Add(str);
		}
		return true;
	}
	public bool bexit=false;

	//Queue<FILEDATA> queue_data= new Queue<FILEDATA>();
	void ProcSave(object _pdata)
	{					
		FILEDATA pdata = _pdata as FILEDATA;
		string nstr = pdata.filename;
		
		//string setupdir = 	Directory.GetParent( Application.dataPath).ToString();
		
		string tempfullname = pdata.setupdir +"/"+ nstr;
		
		tempfullname = tempfullname.Replace('/','\\');
		
		string tempfile =	tempfullname+".temp";
		if(System.IO.File.Exists(tempfile))
		{
			System.IO.File.Delete(tempfile);
		}
		
		int idx = tempfullname.LastIndexOf('\\');
		
		string destDirectoryFullName = tempfullname;
		if(idx>=0)
		{
			destDirectoryFullName = tempfullname.Substring(0,idx);
			if (!System.IO.Directory.Exists(destDirectoryFullName))
            {
                System.IO.Directory.CreateDirectory(destDirectoryFullName);
            }
		}
		
		if(System.IO.Directory.Exists(tempfullname))
		{
			UnityEngine.Debug.LogError("同名文件夹存在" + nstr);
		}
		else
		{

			using (FileStream fs = System.IO.File.Create(tempfullname))
	        {
//				int leftlen = pdata.bytes.Length;
//				int refl = 0;
//				while(leftlen > 0)
//				{
//					int len = Mathf.Min(1000,leftlen);
//					
//					fs.Write(pdata.bytes, refl,len );
//					Thread.Sleep(10);
//					leftlen = leftlen - len; 
//					refl += len;
//				}
			

	            fs.Write(pdata.bytes, 0, pdata.bytes.Length);	
				
				fs.Close();
			}
			UIResourcesStepDowanload.GetInst().DownLoadOver(nstr.Substring(5, nstr.Length - 5));

		}
		pdata.w3.bsaved = true;

	}
	void OnDestroy()
	{
		bexit = true;
		//thread_save.Abort();
	}
	//Thread thread_save;
	void Awake()
	{

		instance = this;
	}
	private bool userlauncer = false;
	
	public bool IsUesLuancher
	{
		get
		{
//			return ( userlauncer &&  User32API.fatherhandel.ToInt32()>0);
			return ( userlauncer );
		}
	}
	
	// Use this for initialization
	void Start () {
		//StartCoroutine(GetIp());
		Init();
	}
	
	public bool binit =false;
	public void Init()
	{
		if(binit)
			return;
		
//		string txt_userlauncher= ConfigIni.GetInst().IniReadValue("ServerInfo","uselauncher");
//		if(txt_userlauncher.Length>0)
//		{
//			userlauncer = tcom.tools.TEngine.GetIntFromString( txt_userlauncher) > 0;
//		}
//		
//		webservername= ConfigIni.GetInst().IniReadValue("ServerInfo","txt_wwwaddress");
//		if(webservername.Length>0)
//		{
//			webservername+="data/";
//			bIpLoaded = true;
//		}
//		else{
//			UnityEngine.Debug.LogError("读取serverip 失败");
//		}
		
		binit = true;
	}
	public bool bIpLoaded = false;
//	IEnumerator GetIp()
//	{
//		WWW v = new WWW( "file:///"+ Directory.GetParent( Application.dataPath)+"/config.ini");
//		yield return v;
//		
//		if(v.isDone)
//		{
//			if(v.error!=null)
//			{
//				Debug.LogError(v.error);
//			}
//			else
//			{
//				string str =v.text;
//				int stpos = str.IndexOf("txt_wwwaddress");		
//				int endpos= str.IndexOf("gameresource_isdownload");
//				string sstr = "txt_wwwaddress=";
//				string ip = str.Substring(stpos  +sstr.Length,endpos - (stpos  +sstr.Length) );
//				ip = ip.Trim();
//				webservername = ip + "data/";
//				bIpLoaded = true;
//			}
//		}
//		else
//		{
//			Debug.LogError("下载配置文件错误");
//		}
//		
//		v.Dispose();
//	}
	WWW GetWD(string url)
    {
        foreach (TWWW www in downloadinglist)
        {
            if (www.www.url == url)
                return www.www;
        }
        return null;
    }
	public void tOnGUI()
	{
		int i =  0;
		foreach(TWWW w in downloadinglist)
		{
			if(w.www.error==null)
			{
				GUI.Label(new Rect(20,i*30,1000,25), w.www.url + " 已完成:"+ w.www.progress*100 + "%");
			}
			else
			{
				GUI.Label(new Rect(20,i*30,1000,25), w.www.url + " 下载错误:"+ w.www.error.ToString());
			}
			i++;
		}
	}
 	public bool isDownloading(string str)
	{
		str.Trim();
		str = str.Replace(" ","%20");
		str = str.Replace('\\','/');
		
		if(string.IsNullOrEmpty(str) || string.IsNullOrEmpty(Path.GetFileName(str)))
			return false;
		
		foreach(TWWW w in downloadinglist)
		{
			if(w.www.url == str && w.bsaved==false)
			{
				return true;
			}
		}
		
		return false; 
	}
	void AddToSaveQueue(string filename,TWWW w3)
	{
//		
//		
//		FILEDATA[] arr = queue_data.ToArray();
//		for(int i =0;i<arr.Length;i++)
//		{
//			if(arr[i].filename == filename)
//			{
//				//已经添加进来了
//				return ;
//			}
//		}
		
	 
		byte[] bytes = w3.www.bytes; 				
		FILEDATA fdata = new FILEDATA();
		fdata.bytes = bytes;
		fdata.setupdir =	Directory.GetParent( Application.dataPath).ToString();
		fdata.filename = filename;
		fdata.w3 = w3;
		float timeold = Time.realtimeSinceStartup;
		ProcSave(fdata);
		//Debug.Log("保存文件"+ fdata.filename+ "用时" + (Time.realtimeSinceStartup - timeold));
//		Thread	thread_save = new Thread(ProcSave);	
//		thread_save.Priority = System.Threading.ThreadPriority.BelowNormal;
//		thread_save.Start(fdata);
		return ;
	}
	// Update is called once per frame
//	public void tUpdate()
//	{
// 		 
//		if( Logic.GetInstance().beenInit()  )
//		{
//			while(taskqueue.Count>0)
//			{
//				string str = taskqueue[0];
//				taskqueue.RemoveAt(0);
//				if( User32API.fatherhandel.ToInt32()>0)
//				{	
//					string webdownaload = str.Replace("%20"," ");
//					User32API.AddRequest(webdownaload,TYPE_LAUNCHERCOMMAND.TYPE_LAUNCHERCOMMAND_DOWNLOAD);
//				}
//				else
//				{
//					if(DownLoadQueue.IndexOf(str)<0)
//					{	
//						//如果downloadqueue里没有，再检查downloadinglist里有没有
//						if(GetWD(str)==null)
//						{
//							//如果下载列表也没有，那么添加到下载列表中
//							DownLoadQueue.Add( str);
//						}
//					}
//				}
//			}
//		}
//		
//		//如果正在下载的文件小于20个
//        if (downloadinglist.Count < maxdownload)
//        {
//			// 如果还有需要下载的文件
//            if (DownLoadQueue.Count > 0 )
//			{
// 				if(DownLoadQueue.Count> 0)
//				{
// 					if (GetWD(DownLoadQueue[0]) == null)
//					{
//						
//						downloadinglist.Add(new TWWW(DownLoadQueue[0]));
//					}
//					
//					DownLoadQueue.RemoveAt(0);   
//					
//				}
//			}
//		}
// 
//		for(int i =0;i<downloadinglist.Count;i++)
//		{
//			if(downloadinglist[i].www.isDone )
//			{
//				string url = downloadinglist[i].www.url;
//				//url = WWW.UnEscapeURL(url);
//				url = url.Replace("%20"," ");
//				string nstr ="data/"+ url.Substring(webservername.Length,url.Length - webservername.Length).ToLower();
//				if(downloadinglist[i].www.error==null  )
//				{
//					//float ti = Time.time;
//			
//					if(downloadinglist[i].www.bytes!=null)
//					{
//						if(downloadinglist[i].bsaved )
//						{					
//							downloadinglist[i].www.Dispose();
//							downloadinglist.RemoveAt(i);
//						}
//						else
//						{
//							//还没有存完，继续轮训检查
//							AddToSaveQueue(nstr, downloadinglist[i]);
//							
//						}
//					}
//					else
//					{
//						UnityEngine.Debug.LogError(url + " download faild");	
//						UIResourcesStepDowanload.GetInst().DownLoadError(nstr.Substring(5, nstr.Length - 5));
//											
//						downloadinglist[i].www.Dispose();
//						downloadinglist.RemoveAt(i);
//					}
//						//float nt= Time.time - ti;
//						
//						//Debug.Log("保存文件"+  url + nt.ToString() +",ti="+ ti.ToString() + " Time.time="+Time.time);
//
//					return;
//				}
//				else
//				{
//					UIResourcesStepDowanload.GetInst().DownLoadError(nstr.Substring(5, nstr.Length - 5));
//					
//					string purl = downloadinglist[i].www.url + " download faild"+ downloadinglist[i].www.error; 
//					downloadinglist[i].www.threadPriority = 0; 
//					UnityEngine.Debug.Log(purl);
//					
//					//创建一个临时文件
//					string setupdir = 	Directory.GetParent( Application.dataPath).ToString();
//						
//					string tempfullname = setupdir +"/"+ nstr;
//					
//					tempfullname = tempfullname.Replace('/','\\');
//					
//					int idx = tempfullname.LastIndexOf('\\');
//					
//					string destDirectoryFullName = tempfullname;
//					
//					if(idx>=0)
//					{
//						destDirectoryFullName = tempfullname.Substring(0,idx);
//						
//						if (!System.IO.Directory.Exists(destDirectoryFullName))
//	                    {
//	                        System.IO.Directory.CreateDirectory(destDirectoryFullName);
//	                    }
//					}
//					
//					string tempfile =	tempfullname+".temp";
//					if(!System.IO.File.Exists(tempfile))
//					{
//				        using (FileStream fs = System.IO.File.Create(tempfile))
//				        {
//							
//				        }
//					}
//					
//					//从下载列表中删了吧。
//					downloadinglist[i].www.Dispose();
//					downloadinglist.RemoveAt(i);
//					return;
//				}
//			}
//		}
//	}
	
	public bool IsDownloadListBusy()
	{
		return (downloadinglist.Count >= maxdownload);
	}
	public bool IsBusy(int num)
	{
		return downloadinglist.Count >= num;
	}
}